package ansi.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import ansi.exception.DAOExcepcion;
import ansi.modelo.Vivienda;
import ansi.util.ConexionBD;
import ansi.util.Constantes;

public class ViviendaDAO extends BaseDAO {

	public Vivienda obtener(int idVivienda) throws DAOExcepcion {
		Vivienda vo = new Vivienda();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idVivienda, Ubicacion_Vivienda, Numero_Vivienda, Metraje_Vivienda, Tipo_Vivienda, Estado_Vivienda, Residente_DNI_Residente from Vivienda where Estado_Vivienda= 1 and idVivienda = ? ";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idVivienda);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdVivienda(rs.getInt("idVivienda"));
				vo.setUbicacion_Vivienda(rs.getString("Ubicacion_Vivienda"));
				vo.setNumero_Vivienda(rs.getInt("Numero_Vivienda"));
				vo.setMetraje_Vivienda(rs.getDouble("Metraje_Vivienda"));
				vo.setEstado_Vivienda(rs.getInt("Estado_Vivienda"));
				vo.setTipo_Vivienda(rs.getString("Tipo_Vivienda"));
				vo.setResidente_DNI_Residente(rs
						.getInt("Residente_DNI_Residente"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Vivienda obtenerPorNumeroVivienda(Integer numero, String ubicacion)
			throws DAOExcepcion {
		Vivienda vo = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idVivienda, Ubicacion_Vivienda, Numero_Vivienda, Metraje_Vivienda, Tipo_Vivienda, Residente_DNI_Residente from Vivienda ";
			query += " where Numero_Vivienda = ? and Ubicacion_Vivienda = ? ";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, numero);
			stmt.setString(2, ubicacion);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo = new Vivienda();
				vo.setIdVivienda(rs.getInt("idVivienda"));
				vo.setUbicacion_Vivienda(rs.getString("Ubicacion_Vivienda"));
				vo.setNumero_Vivienda(rs.getInt("Numero_Vivienda"));
				vo.setMetraje_Vivienda(rs.getDouble("Metraje_Vivienda"));
				// vo.setEstado_Vivienda(rs.getInt("Estado_Vivienda"));
				vo.setTipo_Vivienda(rs.getString("Tipo_Vivienda"));
				vo.setResidente_DNI_Residente(rs
						.getInt("Residente_DNI_Residente"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Collection<Vivienda> listar() throws DAOExcepcion {
		Collection<Vivienda> c = new ArrayList<Vivienda>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select idVivienda, Ubicacion_Vivienda, Numero_Vivienda, Metraje_Vivienda, Tipo_Vivienda, Residente_DNI_Residente from Vivienda order by Ubicacion_Vivienda";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Vivienda vo = new Vivienda();
				vo.setIdVivienda(rs.getInt("idVivienda"));
				vo.setUbicacion_Vivienda(rs.getString("Ubicacion_Vivienda"));
				vo.setNumero_Vivienda(rs.getInt("Numero_Vivienda"));
				vo.setMetraje_Vivienda(rs.getDouble("Metraje_Vivienda"));
				vo.setTipo_Vivienda(rs.getString("Tipo_Vivienda"));
				// vo.setEstado_Vivienda(rs.getInt("Estado_Vivienda"));
				vo.setResidente_DNI_Residente(rs
						.getInt("Residente_DNI_Residente"));
				c.add(vo);

			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public void insertar(Vivienda vo) throws DAOExcepcion {
		String query = "INSERT INTO Vivienda "
				+ " (Ubicacion_Vivienda, Numero_Vivienda, Metraje_Vivienda, Tipo_Vivienda, Estado_Vivienda, Residente_DNI_Residente) "
				+ " VALUES (?, ?, ?, ?, ?, ?)";

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);

			stmt.setString(1, vo.getUbicacion_Vivienda());
			stmt.setInt(2, vo.getNumero_Vivienda());
			stmt.setDouble(3, vo.getMetraje_Vivienda());
			stmt.setString(4, vo.getTipo_Vivienda());
			stmt.setInt(5, Constantes.VIVIENDA_ESTADO_ACTIVO);
			stmt.setInt(6, vo.getResidente_DNI_Residente());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}

			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setIdVivienda(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Vivienda actualizar(Vivienda vo) throws DAOExcepcion {
		String query = "update Vivienda set Ubicacion_Vivienda=?, Numero_Vivienda=?, Metraje_Vivienda=?, Tipo_Vivienda=?, Residente_DNI_Residente=? where idVivienda = ? ";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getUbicacion_Vivienda());
			stmt.setInt(2, vo.getNumero_Vivienda());
			stmt.setDouble(3, vo.getMetraje_Vivienda());
			stmt.setString(4, vo.getTipo_Vivienda());
			// stmt.setInt(5, vo.getEstado_Vivienda());
			stmt.setInt(6, vo.getResidente_DNI_Residente());
			stmt.setInt(7, vo.getIdVivienda());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int idVivienda) throws DAOExcepcion {
		// String query =
		// "update Estado_Vivienda from Vivienda WHERE idVivienda=?";
		String query = "update Vivienda set Estado_Vivienda= "
				+ Constantes.VIVIENDA_ESTADO_INACTIVO + " WHERE idVivienda=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idVivienda);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<Vivienda> buscarPorVivienda(String nombre)

	throws DAOExcepcion {

		String query = "select idVivienda,Ubicacion_Vivienda,Numero_Vivienda,Metraje_Vivienda,Tipo_Vivienda,Estado_Vivienda, Residente_DNI_Residente from Vivienda where Ubicacion_Vivienda like ?";

		Collection<Vivienda> lista = new ArrayList<Vivienda>();

		Connection con = null;

		PreparedStatement stmt = null;

		ResultSet rs = null;

		try {

			con = ConexionBD.obtenerConexion();

			stmt = con.prepareStatement(query);

			stmt.setString(1, nombre + "%");

			rs = stmt.executeQuery();

			while (rs.next()) {

				Vivienda vo = new Vivienda();

				vo.setIdVivienda(rs.getInt("idVivienda"));

				vo.setUbicacion_Vivienda(rs.getString("Ubicacion_Vivienda"));

				vo.setNumero_Vivienda(rs.getInt("Numero_Vivienda"));

				vo.setMetraje_Vivienda(rs.getDouble("Metraje_Vivienda"));

				vo.setTipo_Vivienda(rs.getString("Tipo_Vivienda"));

				vo.setEstado_Vivienda(rs
						.getInt(Constantes.VIVIENDA_ESTADO_ACTIVO));

				vo.setResidente_DNI_Residente(rs
						.getInt("Residente_DNI_Residente"));

				lista.add(vo);

			}

		} catch (SQLException e) {

			System.err.println(e.getMessage());

			throw new DAOExcepcion(e.getMessage());

		} finally {

			this.cerrarResultSet(rs);

			this.cerrarStatement(stmt);

			this.cerrarConexion(con);

		}

		return lista;

	}

	public Collection<Vivienda> buscarViviendaPorDNI(String nombre)

			throws DAOExcepcion {

				String query = "select idVivienda,Ubicacion_Vivienda,Numero_Vivienda,Metraje_Vivienda,Tipo_Vivienda,Estado_Vivienda, Residente_DNI_Residente from Vivienda where Residente_DNI_Residente like ?";

				Collection<Vivienda> lista = new ArrayList<Vivienda>();

				Connection con = null;

				PreparedStatement stmt = null;

				ResultSet rs = null;

				try {

					con = ConexionBD.obtenerConexion();

					stmt = con.prepareStatement(query);

					stmt.setString(1, nombre + "%");

					rs = stmt.executeQuery();

					while (rs.next()) {

						Vivienda vo = new Vivienda();

						vo.setIdVivienda(rs.getInt("idVivienda"));

						vo.setUbicacion_Vivienda(rs.getString("Ubicacion_Vivienda"));

						vo.setNumero_Vivienda(rs.getInt("Numero_Vivienda"));

						vo.setMetraje_Vivienda(rs.getDouble("Metraje_Vivienda"));

						vo.setTipo_Vivienda(rs.getString("Tipo_Vivienda"));

						vo.setEstado_Vivienda(rs
								.getInt(Constantes.VIVIENDA_ESTADO_ACTIVO));

						vo.setResidente_DNI_Residente(rs
								.getInt("Residente_DNI_Residente"));

						lista.add(vo);

					}

				} catch (SQLException e) {

					System.err.println(e.getMessage());

					throw new DAOExcepcion(e.getMessage());

				} finally {

					this.cerrarResultSet(rs);

					this.cerrarStatement(stmt);

					this.cerrarConexion(con);

				}

				return lista;

			}

}
